package com.aaa.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author: YuXin
 * @Date : Created in 2020/11/6 14:37
 * @ClassName : IPFilter
 * @Description : 过滤非法ip  防止网站受到攻击
 * @Package_Name : com.aaa.zuulserver.filter
 */
@Component
public class IllegalIPFilter extends ZuulFilter {

    @Value("${illegalIp}")
    private String illegalIpAddr;

    /**
     * filterType 过滤器类型  主要是定义过滤器使用的类型和时机
     */
    @Override
    public String filterType() {
        /**
         *  pre 在执行业务之前  和web filter 一致
         *  route  在执行业务中执行
         *  post   在执行任务之后  最终要调用的
         *  error  在执行任务发生错误时候执行
         */
        return "pre";
    }

    /**
     * 当有多个过滤器时候  该方法根据返回值的大小确定执行先后顺序  值越小  优先级越高
     */
    @Override
    public int filterOrder() {
        return 5;
    }

    /**
     * 确定该filter是否开启
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * filter过滤要执行的业务
     */
    @lombok.SneakyThrows
    @Override
    public Object run() {
        //使用zuul包中提供的请求上下文对象请求的对象
        RequestContext currentContext = RequestContext.getCurrentContext();
        //获取request对象
        HttpServletRequest request = currentContext.getRequest();
        //获取request对象
        HttpServletResponse response = currentContext.getResponse();
        //获取请求的ip地址
        String remoteAddr = request.getRemoteAddr();
        //判断ip地址是否合法
        if (illegalIpAddr.contains("192.168.1.53")) {
            //currentContext.setResponseStatusCode(403);
            currentContext.setSendZuulResponse(false);
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            //返回禁止访问的信息
            response.sendError(HttpStatus.SC_FORBIDDEN, "你的IP非法  禁止访问！");
        }
        return null;
    }
}
